//给定一个只包括 '('，')'，'{'，'}'，'['，']' 的字符串，判断字符串是否有效。 
//
// 有效字符串需满足： 
//
// 
// 左括号必须用相同类型的右括号闭合。 
// 左括号必须以正确的顺序闭合。 
// 
//
// 注意空字符串可被认为是有效字符串。 
//
// 示例 1: 
//
// 输入: "()"
//输出: true
// 
//
// 示例 2: 
//
// 输入: "()[]{}"
//输出: true
// 
//
// 示例 3: 
//
// 输入: "(]"
//输出: false
// 
//
// 示例 4: 
//
// 输入: "([)]"
//输出: false
// 
//
// 示例 5: 
//
// 输入: "{[]}"
//输出: true 
// Related Topics 栈 字符串


package leetcode.editor.cn;

import java.util.*;

public class P20ValidParentheses {
    public static void main(String[] args) {
        Solution solution = new P20ValidParentheses().new Solution();
        //TO TEST
        solution.isValid("[}");
    }

    //leetcode submit region begin(Prohibit modification and deletion)
    class Solution {
        public boolean isValid(String s) {
            String trimString = s.trim();
            if (trimString.isEmpty()) {
                return true;
            }
            Stack<Integer> leftStack = new Stack<>();
            List<Character> lefts = Arrays.asList('(', '{', '[');
            List<Character> rights = Arrays.asList(')', '}', ']');
            int length = trimString.length();
            for (int i = 0; i < length; i++) {
                Character c = trimString.charAt(i);
                int l = lefts.indexOf(c);
                if (l > -1) {
                    leftStack.push(l);
                } else {
                    int r = rights.indexOf(c);
                    if (r > -1 && (leftStack.empty() || leftStack.pop() != r)) {
                        return false;
                    }
                }
            }
            return leftStack.empty();
        }
    }
//leetcode submit region end(Prohibit modification and deletion)

}